package com.xlhl.init.utils;

import lombok.extern.slf4j.Slf4j;

/**
 * @author xlhl
 */
@Slf4j
public class AuthUtil {

    /**
     * 判断 permission 中对应 position 位是否为 1
     *
     * @param permission 位图（可为null，null表示无任何权限）
     * @param position   权限位（从0开始，0-63）
     * @return 是否有权限
     */
    public static boolean checkPermission(Long permission, Integer position) {
        // 空值检查
        if (permission == null || position == null) {
            log.debug("权限位图或者权限位数为null，视为无权限");
            return false;
        }

        if (permission < 0) {
            log.error("权限位图错误: permission={}", permission);
            return false;
        }

        // 边界检查（long类型有64位）
        int longMaxLen = 64;
        if (position < 0 || position >= longMaxLen) {
            log.warn("权限位位置超出范围: position={}", position);
            return false;
        }

        try {
            return ((permission >> position) & 1) == 1;
        } catch (Exception e) {
            log.error("权限检查异常: permission={}, position={}", permission, position, e);
            return false;
        }
    }

    /**
     * 将位图对应位数赋值为 1，并返回新的位图
     *
     * @param permission 位图（可为null，null表示无任何权限）
     * @param position   权限位（从0开始，0-63）
     * @return 新的权限位图
     */
    public static Long addPermission(Long permission, Integer position) {
        // 空值检查
        if (permission == null || position == null) {
            log.debug("权限位图或者权限位数为null，视为无权限");
            return 0L;
        }

        if (permission < 0) {
            log.error("权限位图错误: permission={}", permission);
            return 0L;
        }

        // 边界检查（long类型有64位）
        int longMaxLen = 64;
        if (position < 0 || position >= longMaxLen) {
            log.warn("权限位位置超出范围: position={}", position);
            return 0L;
        }

        try {
            return permission | (1L << position);
        } catch (Exception e) {
            log.error("权限检查异常: permission={}, position={}", permission, position, e);
            return 0L;
        }
    }
}
